package talayaco.dao;

import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface CorralDAO {

	/**
	 * Metodo que inserta un nuevo corral en la base de datos
	 * 
	 * @return datosCorral Mapa con los datos del corral a insertar
	 * @throws Exception
	 */
	void insertCorral(Map<String, String> datosCorral) throws Exception;

	/**
	 * Elimina un corral de la base de datos
	 * 
	 * @return nombreCorral nombre del corral
	 * @throws Exception
	 */
	void deleteCorral(String nombreCorral) throws Exception;

	/**
	 * Obtiene un corral en base a su id
	 * 
	 * @param nombreCorral
	 *            Nombre del corral
	 * @return Mapa con los datos del corral
	 * @throws Exception
	 */
	Map<String, String> getCorralByNombre(String nombreCorral) throws Exception;

	/**
	 * Obtiene el nombre de un corral a partir del id
	 * 
	 * @param id
	 *            Id del corral
	 * @return NOmbre del corral
	 * @throws Exception
	 */
	String getNombreCorralById(String id) throws Exception;

	/**
	 * Obtiene la lista de corrales
	 * 
	 * @return Lista de mapas con los datos de los corrales
	 * @throws Exception
	 */
	List<String> getNombreCorrales() throws Exception;

	/**
	 * Metodo que verifica si un corral ya existe en la base de datos
	 * 
	 * @param nombreCorral
	 *            Nombre del corral
	 * @return 1 si encontro el corral, 0 caso contrario
	 * @throws Exception
	 */
	String existeCorral(String nombreCorral) throws Exception;

	/**
	 * Metodo que verifica si ya se ingreso un pesaje para el dia de la fecha
	 * 
	 * @param nombreCorral
	 *            Nombre del corral
	 * @return 0 si no se registro un pesaje otro numero caso contrario
	 * @throws Exception
	 */
	String existePesajeFecha(String fecha) throws Exception;

	/**
	 * Actualiza los datos del corral.
	 * 
	 * @param datosCorral
	 *            Mapa con los datos del Corral a actualizar
	 * @throws Exception
	 */
	void updateCorral(Map<String, Object> datosCorral) throws Exception;

	/**
	 * Metodo que obtiene el tipo a partir del nombre de un corral
	 * 
	 * @param nombre
	 *            Nombre corral
	 * @return Tipo del corral
	 * @throws Exception
	 */
	String getTipoAnimalByNombre(String nombre) throws Exception;

	/**
	 * Metodo que permite el el ingreso de pesajes
	 * 
	 * @param id
	 *            id corral
	 * @param cantidad
	 *            Cantidad de comida
	 * @param fecha
	 *            Fecha
	 * @throws Exception
	 */
	void insertPesajes(String id, String cantidad, Date fecha,
			Long cantidadAnimales) throws Exception;

	/**
	 * Obtiene el id del corral en base a su nombre
	 * 
	 * @param nombre
	 *            Nombre corral
	 * @return id
	 * @throws Exception
	 */
	String getIdCorralByNombre(String nombre) throws Exception;

	/**
	 * Actualiza el corral de un animal con caravana
	 * 
	 * @param Caravana
	 *            Numero de caravana
	 * 
	 * @throws Exception
	 */
	void updateMovimientoByCaravana(Map<String, String> datosAnimal)
			throws Exception;

	/**
	 * Actualiza los datos del corral de animal
	 * 
	 * @param datosAnimal
	 *            Mapa con los datos de animales
	 * @throws Exception
	 */
	void updateCorralMovimiento(Map<String, String> datosAnimal)
			throws Exception;

	/**
	 * Obtiene los datos de todos los corrales existentes en la base de datos
	 * 
	 * @return Listado de corrales
	 * @throws Exception
	 */
	List<Map<String, String>> getCorrales() throws Exception;

	/**
	 * Retorna la cantidad de relaciones que existen entre la tabla animal y
	 * corral y un nombre de corral.
	 * 
	 * @param nombre
	 *            Nombre corral
	 * @return Cantidad de relaciones
	 */
	Long cantidadDatosCorral(String nombre) throws Exception;

	/**
	 * Obtiene la fecha de la ultima modificacion de un corral de un tipo de
	 * engorde
	 * 
	 * @param tipoDieta
	 *            Tipo dieta
	 * @throws SQLException
	 */
	Date getFechaUltimaModificacionCorral(String tipoDieta) throws SQLException;

	/**
	 * Obtiene la cantidad de animales que se encuentran en un corral
	 * 
	 * @param idCorral
	 * @return
	 */
	Long getCantidadAnimalesEnCorral(String idCorral) throws Exception;

	/**
	 * Obtiene los datos para el reporte de pesajes
	 * 
	 * @param fechaDesde
	 *            Fecha desde
	 * @param fechaHasta
	 *            Fecha Hasta
	 * @param nombre
	 *            Nombre del corral
	 * @return
	 * @throws Exception
	 */
	List<Map<String, String>> getReportePesajes(Date fechaDesde,
			Date fechaHasta, String nombre) throws Exception;
}
